winsafe\oleaut\structs/
structs_other.rs1#![allow(non_snake_case)]
2
3use std::marker::PhantomData;
4use std::mem::ManuallyDrop;
5
6use crate::co;
7use crate::decl::*;
8use crate::kernel::{ffi_types::*, privs::*};
9use crate::oleaut::{ffi, privs::*};
10
11#[repr(C)]
14pub struct DISPPARAMS<'a, 'b> {
15 rvarg: *mut VARIANT, rgdispidNamedArgs: *mut co::DISPID,
17 cArgs: u32,
18 cNamedArgs: u32,
19
20 _rvar: PhantomData<&'a mut VARIANT>,
21 _rgdispidNamedArgs: PhantomData<&'b mut co::DISPID>,
22}
23
24impl_default!(DISPPARAMS, 'a, 'b);
25
26impl<'a, 'b> DISPPARAMS<'a, 'b> {
27 pub_fn_array_buf_get_set!('a, rvarg, set_rvarg, cArgs, VARIANT);
28 pub_fn_array_buf_get_set!('b, rgdispidNamedArgs, set_rgdispidNamedArgs, cNamedArgs, co::DISPID);
29}
30
31#[repr(C)]
39pub struct EXCEPINFO {
40 pub wCode: u16,
41 wReserved: u16,
42 bstrSource: *mut u16,
43 bstrDescription: *mut u16,
44 bstrHelpFile: *mut u16,
45 pub dwHelpContext: u32,
46 pvReserved: *mut std::ffi::c_void,
47 pfnDeferredFillIn: *mut std::ffi::c_void,
48 pub scode: i32,
49}
50
51unsafe impl Send for EXCEPINFO {}
52unsafe impl Sync for EXCEPINFO {}
53
54impl Drop for EXCEPINFO {
55 fn drop(&mut self) {
56 if !self.bstrSource.is_null() {
57 let _ = unsafe { BSTR::from_ptr(self.bstrSource) };
58 }
59 if !self.bstrDescription.is_null() {
60 let _ = unsafe { BSTR::from_ptr(self.bstrDescription) };
61 }
62 if !self.bstrHelpFile.is_null() {
63 let _ = unsafe { BSTR::from_ptr(self.bstrHelpFile) };
64 }
65 }
66}
67
68impl std::error::Error for EXCEPINFO {
69 fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
70 None
71 }
72}
73
74impl std::fmt::Display for EXCEPINFO {
75 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
76 write!(
77 f,
78 "{} - {}",
79 self.bstrSource().unwrap_or("(no source)".to_owned()),
80 self.bstrDescription()
81 .unwrap_or("(no description)".to_owned()),
82 )
83 }
84}
85impl std::fmt::Debug for EXCEPINFO {
86 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87 std::fmt::Display::fmt(self, f)
88 }
89}
90
91impl_default!(EXCEPINFO);
92
93impl EXCEPINFO {
94 pub_fn_bstr_get!(bstrSource);
95 pub_fn_bstr_get!(bstrDescription);
96 pub_fn_bstr_get!(bstrHelpFile);
97}
98
99#[repr(C, packed(2))]
102#[derive(Clone, Copy, PartialEq, Eq)]
103pub struct PROPERTYKEY {
104 pub fmtid: GUID,
105 pub pid: u32,
106}
107
108impl_default!(PROPERTYKEY);
109
110impl AsRef<PROPERTYKEY> for PROPERTYKEY {
111 fn as_ref(&self) -> &PROPERTYKEY {
112 self
113 }
114}
115
116impl PROPERTYKEY {
117 #[must_use]
120 pub const fn new(fmtid: GUID) -> Self {
121 Self { fmtid, pid: PID_FIRST_USABLE }
122 }
123}
124
125#[repr(C)]
130pub struct PROPVARIANT {
131 pub(crate) vt: co::VT,
132 wReserved1: u16,
133 wReserved2: u16,
134 wReserved3: u16,
135 pub(crate) data: PROPVARIANT_union,
136}
137
138#[repr(C)]
139pub(crate) union PROPVARIANT_union {
140 pub(crate) cVal: i8,
141 pub(crate) bVal: u8,
142 pub(crate) iVal: i16,
143 pub(crate) uiVal: u16,
144 pub(crate) lVal: i32,
145 pub(crate) ulVal: u32,
146 pub(crate) hVal: i64,
147 pub(crate) uhVal: u64,
148 pub(crate) fltVal: f32,
149 pub(crate) dblVal: f64,
150 pub(crate) ptr: *mut std::ffi::c_void, pub(crate) cac: ManuallyDrop<CAC>,
152}
153
154#[repr(C)]
155pub(crate) struct CAC {
156 cElems: u32,
157 pElems: *mut i8,
158}
159
160impl Drop for PROPVARIANT {
161 fn drop(&mut self) {
162 if self.vt() != co::VT::EMPTY {
163 unsafe {
164 ffi::PropVariantClear(self as *mut _ as _); }
166 }
167 }
168}
169
170impl_default!(PROPVARIANT); impl PROPVARIANT {
173 #[must_use]
175 pub const fn vt(&self) -> co::VT {
176 self.vt
177 }
178}
179
180#[repr(C)]
185pub struct VARIANT {
186 pub(crate) vt: co::VT,
187 wReserved1: u16,
188 wReserved2: u16,
189 wReserved3: u16,
190 pub(crate) data: VARIANT_union,
191}
192
193#[repr(C)]
194pub(crate) union VARIANT_union {
195 pub(crate) llVal: i64,
196 pub(crate) lVal: i32,
197 pub(crate) bVal: u8,
198 pub(crate) iVal: i16,
199 pub(crate) fltVal: f32,
200 pub(crate) dblVal: f64,
201 pub(crate) cVal: i8,
202 pub(crate) uiVal: u16,
203 pub(crate) ulVal: u32,
204 pub(crate) ullVal: u64,
205 pub(crate) ptr: *mut std::ffi::c_void, pub(crate) brecord: ManuallyDrop<BRECORD>,
207}
208
209#[repr(C)]
210pub(crate) struct BRECORD {
211 pvRecord: *mut std::ffi::c_void,
212 pRecInfo: COMPTR,
213}
214
215impl Drop for VARIANT {
216 fn drop(&mut self) {
217 if self.vt != co::VT::EMPTY {
218 unsafe {
219 ffi::VariantClear(self as *mut _ as _); }
221 }
222 }
223}
224
225impl Default for VARIANT {
226 fn default() -> Self {
227 let mut obj = unsafe { std::mem::zeroed::<Self>() };
228 unsafe {
229 ffi::VariantInit(pvoid(&mut obj));
230 }
231 obj
232 }
233}
234
235impl VARIANT {
236 #[must_use]
238 pub const fn vt(&self) -> co::VT {
239 self.vt
240 }
241}